<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/4/5
 * Time: 21:38
 */
namespace Services;

//	Smarty 未定义命名空间，它的元素属于公共空间，
//	调用公共空间的方式是直接在元素名称前加 \ 就可以，
//	否则php解析器会认为调用的是当前空间下的元素。
//	除了自定义的元素，php自带的元素，都属于公共空间

use Illuminate\Http\Request;

class Controller extends \Smarty
{
	protected $config;
	protected $method;
	public function __construct(){
		parent::__construct();         //调用父类被覆盖的构造方法

		$this->config = require BASE_PATH.'/config/smarty.php';
		//$this->setTemplateDir($this->config['temp_path']);
		$this->setCompileDir($this->config['comp_path']);
		$this->setCacheDir($this->config['cache_path']);
		$this->setConfigDir($this->config['config_path']);

		$this->caching = $this->config['is_cache'];
		$this->cache_lifetime = $this->config['cache_life_time'];
		$this->left_delimiter = $this->config['left_delimiter'];
		$this->right_delimiter = $this->config['right_delimiter'];

		$this->init();	// 初始化调用方法
	}

	/**
	 * 初始调用方法
	 *
	 * @return void
	 */
	public function init(){}

	/*
	 * 重载父类Smarty类中的方法
	 * @param	string	$resource_name	模板的位置
	 * @param	mixed	$cache_id	缓存的ID
	 */

	public function display($resource_name = null, $cache_id = null, $compile_id = null, $parent = null) {

		//将部分全局变量直接分配到模板中使用
		/**
		$this->assign("root", B_ROOT);
		$this->assign("app",B_APP);
		$this->assign("url", B_URL);
		$this->assign("public", B_PUBLIC);
		$this->assign("res", B_RES);
		 * */

		if(is_null($resource_name)){
			$resource_name = Route::getTplPath().".".$this->config['tpl_prefix'];
			if ($this->method){
				$resource_name = str_replace("callmethod",$this->method,$resource_name);
			}

			if(is_file($resource_name)){
				parent::display($resource_name, $cache_id, $compile_id, $parent);
			}else{
				throw new \UnexpectedValueException("视图文件".$resource_name."不存在！");
			}
		}else{
			if(is_file($resource_name)){
				parent::display($resource_name, $cache_id, $compile_id, $parent);
			}else{
				throw new \UnexpectedValueException("视图文件".$resource_name."不存在！");
			}
		}

	}

	/*
		 * 重载父类的Smarty类中的方法
		 * @param	string	$tpl_file	模板文件
		 * @param	mixed	$cache_id	缓存的ID
		 */
	public function isCached($tpl_file=null, $cache_id = null, $compile_id = null, $parent = null) {
		if(is_null($tpl_file)){
			$tpl_file = Route::getTplPath().".".$this->config['tpl_prefix'];
			if ($this->method){
				$tpl_file = str_replace("callmethod",$this->method,$tpl_file);
			}
		}
		return parent::isCached($tpl_file, $cache_id, $compile_id, $parent);
	}

	/*
	 * 重载父类的Smarty类中的方法
	 *  @param	string	$tpl_file	模板文件
	 * @param	mixed	$cache_id	缓存的ID
	 */
	public function clearCache($tpl_file = null, $cache_id = null, $compile_id = null, $exp_time = null, $type = null){
		if(is_null($tpl_file)){
			$tpl_file = Route::getTplPath().".".$this->config['tpl_prefix'];
			if ($this->method){
				$tpl_file = str_replace("callmethod",$this->method,$tpl_file);
			}
		}
		return parent::clearCache($tpl_file, $cache_id, $compile_id, $exp_time);
	}

	/*
	 * 初始化路由callMethod
	 */
	/**
	public function callMethod($method='index',$parameter=0){
		if (method_exists($this,$method)){
			$this->method = $method;
			$parameter = $parameter?$parameter:'';
			$this->$method($parameter);
		}else{
			echo 'method '. $method .' is not exist!';
		}
	}
	 * **/
/**
	public function callMethod(){
		$parameterArr = func_get_args();	// 取得参数，并转化为数组
		$parameterNum = func_num_args();	// 取得参数数量
		$parameters = '';

		if ($parameterNum==0){
			$parameterArr[0] = 'index';	// 方法参数为空，默认加载 index() 方法
		}else{
			for ($i=1; $i<$parameterNum; $i++){
				$parameters .= ','.$parameterArr[$i];
			}
			$parameters = substr($parameters, 1);	// ",7,6" 改为: "7,6" 去掉前面的逗号
		}
		$this->method = $parameterArr[0];

		if (method_exists($this,$parameterArr[0])){
			$this->$parameterArr[0]($parameters);
		}else{
			echo 'method '. $parameterArr[0] .' is not exist!';
		}
**/
		public function callMethod(){
			$parameterArr = func_get_args();	// 取得参数，并转化为数组
			$parameterNum = func_num_args();	// 取得参数数量
			$parameters = '';

			if ($parameterNum == 2){	//	Request::capture(), $match['params'] 引入
				$parameterArr = $parameterArr[1];	// $match['params'] 参数
				$parameterNum = count($parameterArr);
			}

			if ($parameterNum==0){
				$parameterArr[0] = 'index';	// 方法参数为空，默认加载 index() 方法
			}else{
				foreach ($parameterArr as $key=>$value){
					$parameters .= ','.$value;
				}
				$parameterArr[0] = current($parameterArr);

				$parameters = substr($parameters, 1);	// ",7,6" 改为: "7,6" 去掉前面的逗号

				$start = strpos($parameters,',');
				if ($start != 0){
					$parameters = substr($parameters,$start+1);
				}else{
					$parameters = '';
				}
			}

			$this->method = $parameterArr[0];

			if (method_exists($this,$parameterArr[0])){
				/**
				if ($parameters==''){
					$this->$parameterArr[0](Request::capture());
				}else{
					$this->$parameterArr[0](Request::capture(),$parameters);
				}
				 * */
				$this->$parameterArr[0](Request::capture(),$parameters);

			}else{
				echo 'method '. $parameterArr[0] .' is not exist!';
			}
	}

}